//1.var 作用域
function test () {
    var a1 = 15; //局部变量,函数退出时销毁
}
test();
// console.log(a1);  //报错 a1 is not defined

function test1 () {
    a2 = 100; //全局变量
}
test1();
console.log(a2);  //100 不用var修饰就是全局变量了


//2.var 声明提升
function test3 () {
    console.log(age);
    var age = 'xingwei';
}
test3(); //undefined, 不会报错

//test3的写法相当于test4
function test4 () {
    var age;
    console.log(age);
    var age = 'xingwei';
}
test4(); //undefined, 不会报错


//3.反复使用同一变量
function test5 () {
    var age = 'xing';
    var age = 'wei';
    var age = 'xin';
    var age = 'jj';
    var age = 'tt';
    console.log(age); //tt
}
test5();

//4.let块作用域 var函数作用域
function test6 () {
    if (true) {
        let age = 16;
        console.log(age); //16 
    }
    //  console.log(age); //Uncaught ReferenceError: age is not defined
}
test6();

function test7 () {
    if (true) {
        var age = 19;
        console.log(age);
    }
    console.log(age);
}
test7();

//5.生命变量冗余
function text8 () {
    var name;
    var name; //不报错
    let age;
    // let age;  //冗余声明报错
}

function text9 () {
    var name = 'Nicholas';
    console.log(name); // 'Nicholas' 
    if (true) {
        var name = 'Matt';
        console.log(name); // 'Matt' 
    }
    let age = 30;
    console.log(age); // 30 
    if (true) {
        let age = 26;
        console.log(age); // 26 不报错,不算冗余
    }
}

function test10 () {
    var name;
    // let name; // SyntaxError 
    let age;
    // var age; // SyntaxError
}

//6.let的暂时性死区
function test11 () {
    // console.log(age); //Uncaught ReferenceError: Cannot access 'age' before initialization ,不会被提升
    let age = 100;
}
test11();

//7.全局声明
/*
与 var 关键字不同，使用 let 在全局作用域中声明的变量不会成为 window 对象的属性（var 声
明的变量则会）。
*/
var height = 100;
console.log(window.height);

let width = 200;
console.log(window.width);

//8.For循环
function test12 () {
    for (var i = 0; i < 5; i++) {

    }
    console.log(i); //5
}
test12();

function test13 () {
    for (let i = 0; i < 5; i++) {

    }
    // console.log(i);  //Uncaught ReferenceError: i is not defined
}
test13();

// i 是同一个
function test14 () {
    for (var i = 0; i < 5; i++) {
        // console.log("玄幻" + i);  输出0 1 2 3 4
        setTimeout(() => console.log(i), 0); // 输出 5 5 5 5 5
    }
    // console.log(i);  //Uncaught ReferenceError: i is not defined
}
test14();

// i 用 let 声明迭代变量时，JavaScript 引擎在后台会为每个迭代循环声明一个新的迭代变量。
// 每个 setTimeout 引用的都是不同的变量实例，所以 console.log 输出的是我们期望的值
function test15 () {
    for (let i = 0; i < 5; i++) {
        // console.log("玄幻" + i);  输出0 1 2 3 4
        setTimeout(() => console.log(i), 0); // 输出 0 1 2 3 4
    }
    // console.log(i);  //Uncaught ReferenceError: i is not defined
}
test15();


//9.const与let不同,必须初始化,且不能更改
function test16 () {
    const a = 15; //必须初始化
    a = 20; //变量.js:151 Uncaught TypeError: Assignment to constant variable.
}
test16();

//10.const与let的作用域都是块,也不允许重复声明



